//
//  YMIMClient.h
//  YMIM
//
//  Created by reyzhang on 2022/3/17.
//

#import <Foundation/Foundation.h>
#import "YMIMConfig.h"
#import "YMUserInfo.h"
#import "YMLog.h"
#import "YMCommonDefs.h"
#import "YMMessage.h"
#import "YMChatManager.h"
#import "YMGroupManager.h"
#import "YMSocketManager.h"
#import "YMNetworkUtils.h"
#import "YMFriendManager.h"
#import "YMRoomManager.h"
#import "YMTextMessageBody.h"
#import "YMImageMessageBody.h"
#import "YMVoiceMessageBody.h"
#import "YMVideoMessageBody.h"
#import "YMCustomMessageBody.h"


NS_ASSUME_NONNULL_BEGIN

@class YMIMClient;
@protocol YMConnectionStatusDelegate <NSObject>
@optional
/**
 连接状态的的监听器
 如果您设置了消息监听之后，当SDK与服务器的连接状态发生变化时，会回调此方法。
 */
- (void)onYMConnectionStatusChanged:(YMConnectStatusCode)status;

@end

/**
 *  该类为 SDK 的入口类，负责登录登出及连接管理等。 外观模式：由此可以获得其他模块的入口，例如：群组模块。
 *
 */
@interface YMIMClient : NSObject

/**
 *  SDK版本号
 */
@property(nonatomic, strong, readonly) NSString *version;


/**
 *  SDK 的设置选项, 只能通过 initSDKWithConfig：进行设置
 *
 */
@property(nonatomic, strong, readonly) YMIMConfig *config;

/**
 * 当前登录用户信息
 */
@property (nonatomic, strong,readonly) YMUserInfo *userInfo;


/**
 * 连接状态的的监听器
 */
@property (nonatomic, weak) id<YMConnectionStatusDelegate> connectionStatusDelegate;


/**
 * IM 会话逻辑 相关接口集
 */
@property (nonatomic, strong, readonly) YMChatManager *chatManager;

/**
 * IM 群组逻辑 相关接口集
 */
@property (nonatomic, strong, readonly) YMGroupManager *groupManager;

/**
 * IM 聊天室逻辑 相关接口集
 */
@property (nonatomic, strong, readonly) YMRoomManager *roomManager;



/**
 * IM 好友逻辑 相关接口集
 */
@property (nonatomic, strong,readonly) YMFriendManager *friendManager;

/**
 SDK 入口，在调用其他方法前，需要先调用该方法创建一个 Client 实例。
 */
+ (instancetype)sharedClient;


/**
 *  初始化 SDK。
 *
 *  @param config  SDK 配置项。
 *
 */
- (void)initSDKWithConfig:(YMIMConfig *)config;

/**
 *  登录IM服务器
 *
 *  @param token  token令牌鉴权
 *
 * @param completionBlock  登录结果回调
 */
- (void)loginWithToken:(NSString *)token completion:(void(^)(YMConnectStatusCode code))completionBlock;



/**
 * 退出IM服务
 */
- (void)logout;

/**
 * 当用户信息发生改变时，同步用户信息
 *
 * @param userInfo 用户信息
 */
- (void)setUserInfo:(YMUserInfo * _Nullable)userInfo;



/**
 * 绑定个推推送的clientId
 *
 * @param clientId 推送id
 *
 * @param userId 用户id
 */
-(void)bindPushGTClientId:(NSString *)clientId withUserId:(NSString *)userId completion:(void(^)(YMErrorCode code))completionBlock;


@end

NS_ASSUME_NONNULL_END
